home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 1833 / 1833.xpi / chrome / yoono.jar / content / yoono / admin.xul < prev    next >
Extensible Markup Language  |  2009-12-16  |  10KB  |  333 lines

  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
  3.  <window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
  4.         onload = "init();"
  5.  >
  6.  
  7. <script>
  8.  
  9. <![CDATA[
  10. const CI = Components.interfaces;
  11. const CL = Components.classes;
  12.  
  13. Components.utils.import("resource://yoono/yoonoService.js");
  14. Components.utils.import("resource://yoono/yoonoKeyValueDB.js");
  15.  
  16. var timerSearchKey = null;
  17. var FFPath = '';
  18. var IEPath = '';
  19. var IEDir = '';
  20. var IEKeyFile = null;
  21. var target = 'FF';
  22. var IEList = {};
  23.  
  24. var keys = {};
  25.  
  26. function init() {
  27.   var file = Components.classes["@mozilla.org/file/directory_service;1"]
  28.                      .getService(Components.interfaces.nsIProperties)
  29.                      .get('ProfDS', Components.interfaces.nsIFile);
  30.   FFPath = file.path;
  31.   var labelProf = document.getElementById('profile');
  32.   var textNode =  document.createTextNode(FFPath);
  33.   labelProf.appendChild(textNode);
  34.   labelProf.setAttribute('style', '-moz-user-select:text;-moz-user-focus:normal');
  35.  
  36.   IEPath = FFPath;
  37.   var mark = IEPath.indexOf('AppData');
  38.   if( mark != -1) {
  39.     IEPath = IEPath.substring(0, mark) + 'AppData\\LocalLow\\Yoono\\keyvalues';
  40.   } else {
  41.     mark = IEPath.indexOf('Application Data');
  42.     IEPath = IEPath.substring(0, mark) + 'Application Data\\Yoono\\keyvalues';
  43.   }
  44.   IEDir = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
  45.   IEDir.initWithPath(IEPath);
  46.  
  47.   IEKeyFile = IEDir.clone();
  48.   IEKeyFile.append('keys.txt');
  49.   if(!IEKeyFile.exists()) {
  50.     document.getElementById('selectBrowser').setAttribute('collapsed', 'true');
  51.   }
  52.  
  53.   searchKeys();
  54. }
  55.  
  56. function searchKeys() {
  57.   if(timerSearchKey) {
  58.     clearTimeout(timerSearchKey);
  59.   }
  60.   timerSearchKey = setTimeout(function() {doSearchKeys()}, 200);
  61. }
  62.  
  63. function doSearchKeys() {
  64.   document.getElementById('key').focus();
  65.   var key = document.getElementById('key').value;
  66.   var value = '';
  67.   var row = null;
  68.   var label = null;
  69.   var labelText = null;
  70.   var delButton = null;
  71.   var editButton = null;
  72.   var text = '';
  73.   var width = 100;
  74.   var rows = document.getElementById('rows');
  75.   while(rows.lastChild != rows.firstChild) {
  76.     rows.removeChild(rows.lastChild);
  77.   }
  78.   var tab = getKeyValueList(key);
  79.   tab.sort(function(a, b) {
  80.              if(a.key == b.key) return(0);
  81.              if(a.key < b.key) return(-1);
  82.              else return(1);
  83.            });
  84.  
  85.   for(var i=0; i < tab.length; i++ ) {
  86.     key = tab[i].key;
  87.     value = tab[i].value;
  88.     label = document.createElement('label');
  89.     //label.setAttribute('value', key);
  90.     labelText = document.createTextNode(key);
  91.     label.appendChild(labelText);
  92.     label.setAttribute('style', 'padding-top:5px;-moz-user-select:text;-moz-user-focus:normal');
  93.     row = document.createElement('row');
  94.     row.appendChild(label);
  95.  
  96.     delButton = document.createElement('button');
  97.     delButton.setAttribute('label', 'Del');
  98.     delButton.setAttribute('key', key);
  99.     delButton.setAttribute('onclick', 'deleteKey(this)');
  100.     row.appendChild(delButton);
  101.  
  102.     editButton = document.createElement('button');
  103.     editButton.setAttribute('label', 'Edit');
  104.     editButton.setAttribute('key', key);
  105.     editButton.setAttribute('onclick', 'editValue(this)');
  106.     row.setAttribute('style', 'border-bottom: 1px solid lightGrey');
  107.     row.appendChild(editButton);
  108.  
  109.     label = document.createElement('textbox');
  110.     label.setAttribute('size', width);
  111.     label.setAttribute('width', "700px");
  112.     if(value.length > width) {
  113.       var nb = Math.floor(value.length / width);
  114.       if(nb > 10) nb = 10;
  115.       label.setAttribute('multiline', 'true');
  116.       label.setAttribute('rows', nb + 2);
  117.     }
  118.     label.setAttribute('readonly', 'true');
  119.     label.setAttribute('id', key);
  120.     label.setAttribute('value', value);
  121.     row.appendChild(label);
  122.  
  123.     rows.appendChild(row);
  124.   }
  125. }
  126.  
  127. function deleteKey(button) {
  128.   var key = button.getAttribute('key');
  129.   var conf = confirm('Erase ' + key + ' ? ' );
  130.   if(conf) {
  131.     deleteKeyValue(key);
  132.   }
  133.   doSearchKeys();
  134. }
  135.  
  136. function editValue(button) {
  137.   var key = button.getAttribute('key');
  138.   var valueElt = document.getElementById(key);
  139.   var readOnly = valueElt.getAttribute('readonly') || 'false' ;
  140.   if('false' == readOnly) {
  141.     var value = valueElt.value;
  142.     setKeyValue(key, value);
  143.     valueElt.setAttribute('readonly', 'true');
  144.     button.setAttribute('label', 'Edit');
  145.     doSearchKeys();
  146.   } else {
  147.     valueElt.removeAttribute('readonly');
  148.     button.setAttribute('label', 'Save');
  149.   }
  150. }
  151.  
  152. function getKeyValueList(pattern) {
  153.   var tab = new Array();
  154.   if('FF' == target) {
  155.     if(pattern) pattern = '%' + pattern; // trailing % is implemented in YOONO_KEYVALUEDB.getKeyValueList
  156.     var liste = YOONO_KEYVALUEDB.getKeyValueList(pattern);
  157.     for(var key in liste) {
  158.       tab.push({'key' : key, 'value' : liste[key]});
  159.     }
  160.     return(tab);
  161.   }
  162.   var result = {};
  163.   var istream = CL["@mozilla.org/network/file-input-stream;1"].createInstance(CI.nsIFileInputStream);
  164.   istream.init(IEKeyFile, 0x01, 0444, 0);
  165.   istream.QueryInterface(CI.nsILineInputStream);
  166.   IEList = {};
  167.   var line = {};
  168.   var hasmorelines;
  169.   pattern = pattern.toLowerCase();
  170.   do {
  171.     hasmorelines = istream.readLine(line);
  172.     var equalPosition = line.value.indexOf('=');
  173.     if(-1 != equalPosition) {
  174.       var key = line.value.substring(0, equalPosition);
  175.       var fileName = line.value.substring(equalPosition + 1);
  176.       IEList[key] = fileName;
  177.       if(-1 != key.toLowerCase().indexOf(pattern)) {
  178.         var value = readFile(fileName);
  179.         tab.push({'key' : key, 'value' : value});
  180.       }
  181.     }
  182.   } while(hasmorelines);
  183.   istream.close();
  184.   return(tab);
  185. }
  186.  
  187. function deleteKeyValue(key) {
  188.   if('FF' == target) {
  189.     return YOONO_KEYVALUEDB.deleteKeyValue(key);
  190.   }
  191.   // get value file name
  192.   var valueFileName = IEList[key];
  193.   // WARNING. IE does not read the key file again...
  194.   // remove key from list
  195.   delete(IEList[key]);
  196.   // write updated file
  197.   var outputStream = CL["@mozilla.org/network/file-output-stream;1"].createInstance( CI.nsIFileOutputStream);
  198.   var converter = CL['@mozilla.org/intl/converter-output-stream;1'].createInstance(CI.nsIConverterOutputStream);
  199.   converter.init(outputStream, 'UTF-8', 1024, '-');
  200.   // RW, CREATE_FILE, TRUNCATE
  201.   // from http://lxr.mozilla.org/aviary101branch/source/nsprpub/pr/include/prio.h
  202.   outputStream.init(IEKeyFile, 0x04 | 0x08 | 0x20 , 0644, 0);
  203.   for(var key in IEList) {
  204.     converter.writeString(key + '=' + IEList[key] + "\r\n");
  205.   }
  206.   converter.flush();
  207.   outputStream.flush();
  208.   outputStream.close();
  209.  
  210.   // remove matching value file
  211.   var valueFile = IEDir.clone();
  212.   valueFile.append(valueFileName);
  213.   valueFile.remove(false);
  214.   // and re create it empty
  215.   valueFile.create(0, 4);
  216. }
  217.  
  218. function setKeyValue(key, value) {
  219.   if('FF' == target) {
  220.     return YOONO_KEYVALUEDB.setKeyValue(key, value);
  221.   }
  222.   var outputFileName = IEList[key];
  223.   var outputFile = IEDir.clone();
  224.   outputFile.append(outputFileName);
  225.  
  226.   // write updated file
  227.   var outputStream = CL["@mozilla.org/network/file-output-stream;1"].createInstance( CI.nsIFileOutputStream);
  228.   var converter = CL['@mozilla.org/intl/converter-output-stream;1'].createInstance(CI.nsIConverterOutputStream);
  229.   converter.init(outputStream, 'UTF-8', 1024, '-');
  230.   // RW, CREATE_FILE, TRUNCATE
  231.   // from http://lxr.mozilla.org/aviary101branch/source/nsprpub/pr/include/prio.h
  232.   outputStream.init(outputFile, 0x04 | 0x08 | 0x20 , 0644, 0);
  233.   converter.writeString(value);
  234.   converter.flush();
  235.   outputStream.flush();
  236.   outputStream.close();
  237. }
  238.  
  239. function readFile(fileName) {
  240.   var result = '';
  241.   try {
  242.     var oneFile = IEDir.clone();
  243.     oneFile.append(fileName);
  244.     var istream = CL["@mozilla.org/network/file-input-stream;1"].createInstance(CI.nsIFileInputStream);
  245.     istream.init(oneFile, 0x01, 0444, 0);
  246.     var converter = CL["@mozilla.org/intl/converter-input-stream;1"].createInstance( CI.nsIConverterInputStream);
  247.     converter.init(istream, 'UTF-8', 1024, '-');
  248.     var line = {};
  249.     while(converter.readString(4096, line)) {
  250.       result+=line.value;
  251.     }
  252.     istream.close();
  253.   } catch(e) {
  254.     //alert('File ' + fileName + ' is missing');
  255.   }
  256.   return(result);
  257. }
  258.  
  259. function saveNewKey() {
  260.   if('FF' != target) {
  261.     alert('Not yet available with IE');
  262.   }
  263.   var newKey = document.getElementById('newKey');
  264.   var newValue = document.getElementById('newValue');
  265.   setKeyValue(newKey.value, newValue.value);
  266.   searchKeys();
  267.   newKey.value = '';
  268.   newValue.value = '';
  269. }
  270.  
  271. function setTarget(selector) {
  272.   target = selector.value ;
  273.   if('FF' == target) {
  274.     document.getElementById('profile').firstChild.textContent = FFPath;
  275.   } else {
  276.     document.getElementById('profile').firstChild.textContent = IEPath;
  277.   }
  278.   searchKeys();
  279. }
  280.  
  281. function aboutYoono() {
  282.   document.location = "about:yoono";
  283. }
  284. ]]>
  285. </script>
  286.  
  287. <radiogroup id="selectBrowser">
  288.   <radio label="Firefox" selected="true" value="FF" onclick="setTarget(this)"/>
  289.   <radio label="Internet Explorer" value="IE" onclick="setTarget(this)"/>
  290. </radiogroup>
  291. <hbox>
  292. <label value="Profile directory : "/>
  293. <label id="profile" />
  294. </hbox>
  295. <spacer height="20px"/>
  296. <hbox align="center">
  297.   <label value="Key Filter: "/>
  298.   <textbox onkeyup="searchKeys()" id="key"/>
  299.   <button label="Remove" oncommand="this.previousSibling.value=''; searchKeys()"/>
  300.   <button label="Refresh" oncommand="searchKeys()"/>
  301.   <spacer flex="1"/>
  302.   <button label="About Yoono" oncommand="aboutYoono()"/>
  303.  
  304. </hbox>
  305.  
  306. <hbox align="center">
  307.   <label value="Create new Key: "/>
  308.   <textbox size="40" id="newKey" value="" tabindex="1"/>
  309.   <label value="Value: "/>
  310.   <textbox size="60" id="newValue" value="" tabindex="2"/>
  311.   <button label="Save" onclick="saveNewKey()" tabindex="3"/>
  312. </hbox>
  313. <vbox style="overflow:auto" flex="1">
  314.   <grid>
  315.     <columns>
  316.       <column/> 
  317.       <column/> 
  318.       <column/> 
  319.       <column/> 
  320.     </columns>
  321.     <rows id="rows">
  322.       <row align="center" flex="1" style="border: 1px solid black">
  323.         <label value="Key Name"/>
  324.         <box/>
  325.         <box/>
  326.         <label value="Value"/>
  327.       </row>
  328.     </rows>
  329.   </grid>
  330. </vbox>
  331. </window>
  332.  
  333.